package com.woniu.aimd.config.ai.test;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;

/**
 * @author zcnovice
 * @data 2025/6/10 下午7:18
 */
@Component
public class SpringAIChatClient  {
    @Resource
    @Qualifier("openAiChatModel")
    private ChatModel openAiChatModel;


    /**
     * @Description:   (不用管这个，是为了测试流式响应)
     * @return:
     * @Author:  zcnovice
     * @date:  2025/6/11 下午12:59
     */
    public void run(String... args) throws Exception {
        ChatClient chatClient = ChatClient.builder(openAiChatModel)
                .defaultSystem("你是编程专家")
                .build();

        //3.返回流式对象
        Flux<String> stream = chatClient.prompt()
                .user("人为什么不能用二进制交流")
                .stream()
                .content();
/*
        Flux可以从Stream中创建()
        上面的代码就是流式对象
*/
        //下面使用简单的订阅模式来打印
        stream.subscribe(
                data -> System.out.print(data), // 收到每个数据块时处理
                error -> System.err.println("Error: " + error), // 错误处理
                () -> System.out.println("\nStream completed!") // 完成回调
        );
    }



    /**
     * @Description: 流式响应到前端
     * @return: 
     * @Author:  zcnovice
     * @date:  2025/6/11 下午12:57
     */
    public Flux<String> streamChat(String userInput) {
        // 参数校验
        if (userInput == null || userInput.trim().isEmpty()) {
            return Flux.error(new IllegalArgumentException("用户输入不能为空"));
        }

        try {
            ChatClient chatClient = ChatClient.builder(openAiChatModel)
                    .defaultSystem("你是编程专家")  // 系统角色设定
                    .build();

            return chatClient.prompt()
                    .user(userInput)  // 用户输入
                    .stream()         // 启用流式响应
                    .content()        // 获取内容流
                    .concatWithValues("[DONE]") // 追加结束标记
                    .onErrorResume(e -> Flux.just("AI服务暂时不可用，请稍后再试"));

        } catch (Exception e) {
            return Flux.error(new RuntimeException("处理AI请求时发生异常", e));
        }
    }


}
